package com.yjj.demo.common.utils;

import java.util.Arrays;

/**
 *
 *
 * @author yangjiajia
 * @createdAt 2023/2/23 16:40
 */
public class Test {

    public static void main(String[] args) {
        int a1 = 7, b1 = 1, a2 = 6, b2 = -1, a3 = 0, b3 = -1, a4 = -7, b4 = 1;
        long c1 = combine(a1, b1);
        long c2 = combine(a2, b2);
        long c3 = combine(a3, b3);
        long c4 = combine(a4, b4);

        int[] result1 = parse(c1);
        int[] result2 = parse(c2);
        int[] result3 = parse(c3);
        int[] result4 = parse(c4);

        System.out.println("a1=" + result1[0] + ", b1=" + result1[1] + ", c1=" + c1);
        System.out.println("a2=" + result2[0] + ", b2=" + result2[1] + ", c2=" + c2);
        System.out.println("a3=" + result3[0] + ", b3=" + result3[1] + ", c3=" + c3);
        System.out.println("a4=" + result4[0] + ", b4=" + result4[1] + ", c4=" + c4);
    }

    /**
     * 根据输入的 a 和 b，生成一个 long 类型的数字 c。
     * 其中高 32 位存储 a 的值，低 32 位存储 b 的值。
     *
     * @param a 数字 a
     * @param b 数字 b
     * @return 生成的数字 c
     */
    public static long combine(int a, int b) {
        long c = ((long) a << 32) | (b & 0xFFFFFFFFL);
        if (c < 0) {
            c = (~c) + 1;
        }
        return c;
    }

    /**
     * 根据输入的数字 c，解析出原始的 a 和 b。
     * 其中高 32 位存储 a 的值，低 32 位存储 b 的值。
     *
     * @param c 组合后的数字 c
     * @return 解析出的原始 a 和 b，以数组的形式返回
     */
    public static int[] parse(long c) {
        if (c < 0) {
            c = (~c) + 1;
        }
        int[] result = new int[2];
        result[0] = (int) (c >> 32);
        result[1] = (int) (c & 0xFFFFFFFFL);
        return result;
    }

}
